package com.ittao.taoaicodemother.service;

import com.ittao.taoaicodemother.model.dto.vip.VipRedeemCodeQueryRequest;
import com.ittao.taoaicodemother.model.dto.vip.VipRedeemCodeUpdateRequest;
import com.ittao.taoaicodemother.model.entity.User;
import com.ittao.taoaicodemother.model.entity.VipRedeemCode;
import com.ittao.taoaicodemother.model.vo.user.LoginUserVO;
import com.ittao.taoaicodemother.model.vo.vip.VipRedeemCodeVO;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;

import java.time.LocalDateTime;
import java.util.List;

/**
 * VIP兑换码 服务层（集中所有VIP相关业务）。
 *
 * @author <a href="https://gitee.com/it-heima-ht">程序员 Tao</a>
 */
public interface VipRedeemCodeService extends IService<VipRedeemCode> {

    /**
     * 批量生成兑换码
     * @param count 生成数量，1-100
     * @param validUntil 有效期截止时间
     * @param vipDuration VIP有效期天数，为空时默认365天
     * @param remark 备注
     * @return 生成的兑换码列表
     */
    List<VipRedeemCode> generateRedeemCodes(Integer count, LocalDateTime validUntil, Integer vipDuration, String remark);

    /**
     * 构建查询条件
     * @param queryRequest
     * @return
     */
    QueryWrapper getQueryWrapper(VipRedeemCodeQueryRequest queryRequest);

    /**
     * 获取脱敏的兑换码信息
     * @param vipRedeemCode
     * @return
     */
    VipRedeemCodeVO getVipRedeemCodeVO(VipRedeemCode vipRedeemCode);

    /**
     * 获取脱敏的兑换码信息列表
     * @param vipRedeemCodeList
     * @return
     */
    List<VipRedeemCodeVO> getVipRedeemCodeVOList(List<VipRedeemCode> vipRedeemCodeList);

    /**
     * 兑换VIP（首次开通或续费）
     * @param user 当前用户
     * @param vipCode 兑换码
     * @return 是否兑换成功
     */
    boolean exchangeVip(User user, String vipCode);

    /**
     * VIP续费（正确的覆盖逻辑）
     * @param user 当前用户
     * @param vipCode 新的兑换码
     * @return 是否续费成功
     */
    boolean renewVip(User user, String vipCode);

    /**
     * 获取用户VIP使用历史
     * @param userId
     * @return
     */
    List<VipRedeemCodeVO> getUserVipHistory(Long userId);

    /**
     * 获取用户VIP剩余天数
     * @param userId
     * @return
     */
    int getUserVipRemainingDays(Long userId);

    /**
     * 获取脱敏的已登录用户信息，包含VIP信息
     *
     * @param user 用户
     * @return 脱敏后的用户信息
     */
    LoginUserVO getLoginUserVOWithVipInfo(User user);

    /**
     * 更新过期的兑换码状态
     */
    void updateExpiredCodes();

    /**
     * 根据兑换码查询
     * @param code
     * @return
     */
    VipRedeemCode findByCode(String code);

    /**
     * 生成唯一兑换码
     */
    String generateUniqueCode();

    /**
     * 恢复用户状态（当兑换码被删除时调用）
     * @param redeemCodeId 兑换码ID
     */
    void restoreUserStatusByRedeemCodeId(Long redeemCodeId);

    /**
     * 批量恢复用户状态（当兑换码被批量删除时调用）
     * @param redeemCodeIds 兑换码ID列表
     */
    void batchRestoreUserStatusByRedeemCodeIds(List<Long> redeemCodeIds);

    /**
     * 更新VIP兑换码并同时处理用户状态
     * @param updateRequest 更新请求
     * @return 是否更新成功
     */
    boolean updateVipRedeemCodeWithUserStatus(VipRedeemCodeUpdateRequest updateRequest);

    /**
     * 强制过期兑换码并取消用户VIP权限
     * @param redeemCodeId 兑换码ID
     * @return 操作是否成功
     */
    boolean forceExpireRedeemCode(Long redeemCodeId);

    /**
     * 批量强制过期兑换码并取消用户VIP权限
     * @param redeemCodeIds 兑换码ID列表
     * @return 操作是否成功
     */
    boolean batchForceExpireRedeemCodes(List<Long> redeemCodeIds);
}
